﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using estudent.Models;
using System.Data.Objects.SqlClient;

namespace estudent.Controllers
{
    public class SpreminjanjeRokaController : Controller
    {
        estudentEnt db = new estudentEnt();
        //
        // GET: /SpreminjanjeRoka/

        public ActionResult Index()
        {
            if (Session["Role"].Equals("refe"))
            {
                var profesorji = db.SProfesorjis
                    .Where(p => p.veljavnost == null || p.veljavnost == true)
                    .OrderBy(p => p.priimekProfesor)
                    .ThenBy(p => p.imeProfesor)
                    .Select(p => new SelectListItem
                    {
                        Value = SqlFunctions.StringConvert(p.sProfesor).Trim(),
                        Text = p.priimekProfesor + " " + p.imeProfesor + " - " + SqlFunctions.StringConvert(p.sProfesor).Trim()
                    });
                ViewData["profesorji"] = profesorji;
                return View("SpreminjanjeRoka");
            }
            else
            {
                int sifraProf = Int32.Parse(Session["Name"].ToString());
                var predmeti = db.Poucujes
                    .Where(p => p.sProfesor1 == sifraProf || p.sProfesor2 == sifraProf || p.sProfesor3 == sifraProf)
                    .Where(p => p.veljavnost == null || p.veljavnost == true)
                    .Select(p => new SelectListItem
                    {
                        Value = SqlFunctions.StringConvert(p.sPredmeta).Trim(),
                        Text = p.sPredmeti.imePredmeta + " - " + SqlFunctions.StringConvert(p.sPredmeta).Trim()
                    })
                    .Distinct();
                ViewData["predmeti"] = predmeti;
                return View("SpreminjanjeRokaProf");
            }


        }

        public string VrniPredmete(FormCollection form)
        {
            int prof = Int32.Parse(form["profesor"]);
            string izhod = "";

            IEnumerable<sPredmeti> predmeti = (from p in db.Poucujes
                                               where p.sProfesor1 == prof || p.sProfesor2 == prof || p.sProfesor3 == prof && (p.veljavnost == true || p.veljavnost == null)
                                               orderby p.sPredmeti.imePredmeta
                                               select p.sPredmeti).Distinct();

            izhod += "<option value='prazen'>Izberite predmet</option>";
            foreach (var ele in predmeti)
            {
                izhod += "<option value='" + ele.sPredmeta + "'>" + ele.imePredmeta + " - " + ele.sPredmeta + "</option>";
            }

            return izhod;
        }

        public string VrniRoke(FormCollection form)
        {
            int sifraProf = Int32.Parse(form["profesor"]);
            int sifraPred = Int32.Parse(form["predmet"]);
            bool prijava, ocena;
            long binarno;

            var leta = db.IzpitniRokis
                .Where(p => p.Poucuje.sPredmeta == sifraPred)
                .Where(p => p.Poucuje.sProfesor1 == sifraProf || p.Poucuje.sProfesor2 == sifraProf || p.Poucuje.sProfesor3 == sifraProf)
                .Where(p => p.skrit == null || p.skrit == true)
                .OrderByDescending(p => p.datumRoka)
                .ThenBy(p => p.Poucuje.SProfesorji1.priimekProfesor)
                .ThenBy(p => p.Poucuje.SProfesorji2.priimekProfesor)
                .ThenBy(p => p.Poucuje.SProfesorji.priimekProfesor);

            var prijav = db.PrijaveNaIzpits
                .Where(p => p.IzpitniRoki.Poucuje.sPredmeta == sifraPred)
                .Where(p => p.IzpitniRoki.Poucuje.sProfesor1 == sifraProf || p.IzpitniRoki.Poucuje.sProfesor2 == sifraProf || p.IzpitniRoki.Poucuje.sProfesor3 == sifraProf)
                .GroupBy(p => new { p.IzpitniRoki.Poucuje.idPoucuje, p.datumRoka })
                .Select(skup => new { sProfesor = skup.Key.idPoucuje, datumRoka = skup.Key.datumRoka, stevilo = skup.Count() });

            string izhod = "<tr><th>Izvajalci</th><th>Datum in ura</th><th>Prijave</th><th>Spremeni?</th></tr>";

            foreach (var ele in (IEnumerable<IzpitniRoki>)leta)
            {
                izhod += "<tr>";
                if (prijav.Any(u => u.datumRoka == ele.datumRoka && u.sProfesor == ele.idPoucuje))
                    prijava = true;
                else
                    prijava = false;

                izhod += "<td>" + ele.Poucuje.SProfesorji1.priimekProfesor + " " + ele.Poucuje.SProfesorji1.imeProfesor;

                if (ele.Poucuje.sProfesor2 != null)
                    izhod += ", " + ele.Poucuje.SProfesorji2.priimekProfesor + " " + ele.Poucuje.SProfesorji2.imeProfesor;

                if (ele.Poucuje.sProfesor3 != null)
                    izhod += ", " + ele.Poucuje.SProfesorji.priimekProfesor + " " + ele.Poucuje.SProfesorji.imeProfesor;

                izhod += "</td>";
                binarno = ele.datumRoka.ToBinary();
                izhod += ("<td>" + String.Format("{0:dd/MM/yyyy HH:mm}", ele.datumRoka) + "</td>");

                if (db.PrijaveNaIzpits.Any(p => p.datumRoka == ele.datumRoka && p.idPoucuje == ele.idPoucuje && (p.koncnaOcena != null || p.koncnaOcenaVaj != null || p.ocena != null || p.ocenaVaj != null)))
                    ocena = true;
                else
                    ocena = false;

                if (prijava)
                {
                    if (ocena)
                    {
                        izhod += ("<td>Da</td>");
                        izhod += ("<td><a id=\"potrdi\" class='vpisano' href='SpreminjanjeRoka/Spremeni/" + ele.idPoucuje + "/" + binarno + "'>Spremeni</a></td>");
                    }
                    else
                    {
                        izhod += ("<td>Da</td>");
                        izhod += ("<td><a id=\"potrdi\" class='nevpisano' href='SpreminjanjeRoka/Spremeni/" + ele.idPoucuje + "/" + binarno + "'>Spremeni</a></td>");
                    }
                }
                else
                {
                    izhod += ("<td>Ne</td>");
                    izhod += ("<td><a class='nevpisano' href='SpreminjanjeRoka/Spremeni/" + ele.idPoucuje + "/" + binarno + "'>Spremeni</a></td>");
                }
                izhod += "</tr>";
            }
            return izhod;
        }

        public ActionResult Spremeni(int id, string datum)
        {
            DateTime dat = DateTime.FromBinary(long.Parse(datum));

            var rok = db.IzpitniRokis
                .Where(p => p.idPoucuje == id)
                .Where(p => p.datumRoka == dat)
                .First();
            Session["idPoucuje"] = id;
            Session["datumRoka"] = dat;

            return View(rok);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Spremeni(FormCollection form)
        {
            DateTime starDatum = (DateTime)Session["datumRoka"];
            int starId = (int)Session["idPoucuje"];
            int novId = Int32.Parse(form["idPoucuje"]);
            string predavalnica = form["prostor"];
            int pozMeja, maxTock;
            DateTime datumRoka = new DateTime();
            string temp;

            if (string.IsNullOrEmpty(predavalnica))
                ModelState.AddModelError("prostor", "Polje ne sme biti prazno!");

            if (!Int32.TryParse(form["pozitivnaMeja"], out pozMeja))
                ModelState.AddModelError("pozitivnaMeja", "Polje ne sme biti prazno in vsebuje lahko samo številke");

            if (!Int32.TryParse(form["maxTock"], out maxTock))
                ModelState.AddModelError("maxTock", "Polje ne sme biti prazno in vsebuje lahko samo številke");

            if (pozMeja < 0)
                ModelState.AddModelError("pozitivnaMeja", "Številka ne sme biti negativna");

            if (maxTock < 0)
                ModelState.AddModelError("maxTock", "Številka ne sme biti negativna");

            temp = form["datumRoka"];
            try
            {
                datumRoka = DateTime.Parse(temp);
            }
            catch
            {
                ModelState.AddModelError("datumRoka", "Datum ni prave oblike! Pravilna oblika dd.mm.llll hh:mm(:ss)");
            }

            var original = db.IzpitniRokis
                .Where(p => p.datumRoka == starDatum)
                .Where(p => p.idPoucuje == starId)
                .First();

            if (!ModelState.IsValid)
                return View(original);

            try
            {
                IzpitniRoki urejen = new IzpitniRoki
                {
                    idPoucuje = novId,
                    datumRoka = datumRoka,
                    prostor = predavalnica,
                    pozitivnaMeja = pozMeja,
                    maxTock = maxTock
                };

                if (!starDatum.Equals(datumRoka) || starId != novId)
                {
                    db.AddToIzpitniRokis(urejen);
                    db.SaveChanges();

                    var prijave = db.PrijaveNaIzpits
                        .Where(p => p.datumRoka == starDatum)
                        .Where(p => p.idPoucuje == starId);
                    PrijaveNaIzpit tempPrij;

                    foreach (var ele in prijave)
                    {
                        tempPrij = new PrijaveNaIzpit
                        {
                            idPoucuje = novId,
                            idVpisa = ele.idVpisa,
                            datumRoka = datumRoka
                        };
                        db.AddToPrijaveNaIzpits(tempPrij);
                        db.DeleteObject(ele);
                    }
                    db.SaveChanges();
                    db.DeleteObject(original);
                    db.SaveChanges();


                }
                else
                {
                    db.ApplyCurrentValues(original.EntityKey.EntitySetName, urejen);
                    db.SaveChanges();
                }

                ViewData["uspeh"] = true;
                ViewData["sporocilo"] = "Rok uspešno spremenjen!";
            }
            catch (Exception e)
            {
                ViewData["uspeh"] = false;
                if (e.InnerException != null)
                    ViewData["sporocilo"] = "Napaka v bazi Tehnične podrobnosti: " + e.InnerException.Message;
                else
                    ViewData["sporocilo"] = "Napaka v bazi Tehnične podrobnosti: " + e.Message;
            }


            return View("Rezultat");
        }

    }
}
